pandasのデータフレーム


In [1]:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from pandas import Series, DataFrame

練習問題

(1) 0≦x≦1の範囲を等分した num 個の点ついて、「sin(2πx) + 正規分布の乱数(標準偏差0.3)」を計算した array を返す関数 create_dataset(num) を作成してください。

from numpy.random import normal def create_dataset(num): # この部分のコードを作成すること。 return data_y

In [2]:
from numpy.random import normal

def create_dataset(num):
    data_x = np.linspace(0,1,num)
    data_y = np.sin(2*np.pi*data_x) + normal(loc=0, scale=0.3, size=num)
    return data_y

In [3]:
create_dataset(10)


Out[3]:
array([-0.22516372,  1.06534486,  0.95352544,  1.17982446, -0.13338893,
       -0.26685161, -0.95612908, -1.09781698, -0.52365147, -0.43098013])

(2) (1)の関数について、xの値と、対応する「y = sin(2πx) + 正規分布の乱数(平均0, 標準偏差0.3)」の値を列に持つDataFrameを返すように修正してください。(列の名前は、それぞれ 'x' および 'y' とします。)

例えば、次のような実装方法が考えられます。複数の方法を試してみてください。

  • 列'x'と列'y'に対応するarrayオブジェクト data_x, data_y を用意した後、これらを列に持つDataFrameを定義する。(ディクショナリー形式のオプションで列を指定する。)
  • 列'x'と列'y'に対応するarrayオブジェクト data_x, data_y を用意した後、空のDataFrameを作成して、df['x']=data_x のように列名指定でデータを追加する。
  • 列'x'と列'y'を個別のSeriesオブジェクトとして作成した後、pd.concat()で結合する。

In [4]:
def create_dataset1(num):
    data_x = np.linspace(0,1,num)
    data_y = np.sin(2*np.pi*data_x) + normal(loc=0, scale=0.3, size=num)
    df = DataFrame()
    df['x'] = data_x
    df['y'] = data_y
    return df

In [5]:
create_dataset1(10)


Out[5]:
x y
0 0.000000 0.111013
1 0.111111 0.731003
2 0.222222 0.860077
3 0.333333 0.618995
4 0.444444 0.216699
5 0.555556 -0.368661
6 0.666667 -0.835211
7 0.777778 -1.208139
8 0.888889 -0.776917
9 1.000000 0.332147

In [6]:
def create_dataset2(num):
    data_x = np.linspace(0,1,num)
    data_y = np.sin(2*np.pi*data_x) + normal(loc=0, scale=0.3, size=num)
    df = DataFrame({'x': data_x, 'y': data_y})
    return df

In [7]:
create_dataset2(10)


Out[7]:
x y
0 0.000000 -0.089260
1 0.111111 0.200243
2 0.222222 1.046664
3 0.333333 1.179016
4 0.444444 0.052890
5 0.555556 -0.066754
6 0.666667 -1.149537
7 0.777778 -0.658116
8 0.888889 -1.143610
9 1.000000 -0.446727

In [8]:
def create_dataset3(num):
    data_x = np.linspace(0,1,num)
    data_y = np.sin(2*np.pi*data_x) + normal(loc=0, scale=0.3, size=num)
    col_x = Series(data_x, name='x')
    col_y = Series(data_y, name='y')
    df = pd.concat([col_x, col_y], axis=1)
    return df

In [9]:
create_dataset3(10)


Out[9]:
x y
0 0.000000 -0.277062
1 0.111111 0.824974
2 0.222222 0.785553
3 0.333333 1.200036
4 0.444444 0.343600
5 0.555556 -0.738792
6 0.666667 -1.382242
7 0.777778 -0.825914
8 0.888889 -0.937608
9 1.000000 -0.476843

(3) (2)の関数を用いて、num=1000 のデータフレームを作成した後、describe()メソッドでデータの統計情報を確認してください。


In [10]:
data = create_dataset1(1000)
data.describe()


Out[10]:
x y
count 1000.000000 1000.000000
mean 0.500000 -0.011584
std 0.289109 0.761102
min 0.000000 -1.777944
25% 0.250000 -0.678079
50% 0.500000 0.036033
75% 0.750000 0.644230
max 1.000000 1.729154